import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { expectSuccess, runTRPCTest } from "./test-utils";

describe("CLI Test Suite", () => {
  beforeAll(async () => {
    // Ensure CLI is built before running tests
    console.log("Setting up CLI tests...");
  });

  afterAll(async () => {
    console.log("CLI tests completed.");
  });

  describe("Smoke Tests", () => {
    it("should create a basic project successfully", async () => {
      const result = await runTRPCTest({
        projectName: "smoke-test-basic",
        yes: true,
        install: false,
      });

      expectSuccess(result);
    });

    it("should handle help command", async () => {
      // This test would need to be implemented differently since it's not a project creation
      // For now, we'll just test that the basic functionality works
      expect(true).toBe(true);
    });

    it("should validate project name requirements", async () => {
      const result = await runTRPCTest({
        projectName: "valid-project-name",
        yes: true,
        install: false,
      });

      expectSuccess(result);
    });
  });

  describe("Performance Tests", () => {
    it("should complete project creation within reasonable time", async () => {
      const startTime = Date.now();

      const result = await runTRPCTest({
        projectName: "performance-test",
        yes: true,
        install: false,
      });

      const endTime = Date.now();
      const duration = endTime - startTime;

      expectSuccess(result);

      // Should complete within 30 seconds (without installation)
      expect(duration).toBeLessThan(30000);
    });
  });

  describe("Stability Tests", () => {
    it("should handle multiple rapid project creations", async () => {
      const promises = [];

      for (let i = 0; i < 3; i++) {
        promises.push(
          runTRPCTest({
            projectName: `stability-test-${i}`,
            yes: true,
            install: false,
          }),
        );
      }

      const results = await Promise.all(promises);

      for (const result of results) {
        expectSuccess(result);
      }
    });
  });
});
